Industrie 5 secteurs : Acier, H2, Olefine, Céramique, Ammoniac¶

This is notebook Evolution_industrie.ipynb from Models/Prospective_conso

In [1]:
#region Chargement des packages
#from IPython import get_ipython;
#get_ipython().magic('reset -sf')
import os
import sys
if os.path.basename(os.getcwd())=='Prospective_conso':
    sys.path.append('../../')
from functions.f_notebook import hide_toggle

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
import pandas as pd
from functions.f_tools import *
from functions.f_graphicalTools import *
from Models.Prospective_conso.f_evolution_tools import *
from mycolorpy import colorlist as mcp
import qgrid # great package https://github.com/quantopian/qgrid
import numpy as np
import time
from plotnine import *
from functools import reduce
dpe_colors = ['#009900', '#33cc33', '#B3FF00', '#e6e600', '#FFB300', '#FF4D00', '#FF0000',"#000000"]

# print(os.getcwd())
Graphic_folder = "Graphics/"
Data_folder = "data/"
# endregion

chargement des données Acier¶

In [2]:
#region chargement des données acier
start = time.process_time()
target_year = 2050 # 2030 ou 2050 --> two excel sheets
dim_names=["Production_system","year","Vecteurs"];Index_names = ["Production_system"];Energy_system_name="Production_system"
data_set_from_excel =  pd.read_excel(Data_folder+"Hypotheses_acier_1D_"+str(target_year)+".xlsx", None);
sim_param = extract_sim_param(data_set_from_excel,Index_names = Index_names,dim_names=dim_names,Energy_system_name=Energy_system_name)
sim_param["init_sim_stock"]=create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "unite_prod"
sim_param["retrofit_change_"+sim_param["volume_variable_name"]] = sim_param["retrofit_change_total_proportion_init_unite_prod"]/len(sim_param["years"]) *\
                                                                  sim_param["init_sim_stock"][sim_param["volume_variable_name"]]

Para_2_fill = {param : sim_param["base_index_year"] for param in ["retrofit_improvement","retrofit_change_unite_prod","retrofit_Transition","energy_need_per_unite_prod",
                                                                                                   "new_energy","new_yearly_repartition_per_Energy_source"]}
sim_param   =   complete_parameters(sim_param,Para_2_fill=Para_2_fill)

def f_Compute_conso(x,sim_param,Vecteur):
    conso_unitaire = x["conso_unitaire_"+Vecteur]
    return x["energy_need_per_"+sim_param["volume_variable_name"]] * x[sim_param["volume_variable_name"]]*conso_unitaire
def f_Compute_conso_totale(x,sim_param):
    res=0.
    for Vecteur in sim_param["Vecteurs"]:
        res+=x["conso_"+Vecteur]
    return res

for Vecteur in sim_param["Vecteurs"]:
    sim_param["f_Compute_conso_"+Vecteur]={"conso_"+Vecteur : partial(f_Compute_conso,Vecteur =Vecteur)}
sim_param["f_Compute_conso_totale"]={"Conso" : lambda x,sim_param: f_Compute_conso_totale(x,sim_param)}


def f_Compute_emissions(x,sim_param):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["Emissions_scope_2_3"][Vecteur_]
    emissions+= x["emissions_unitaire"]* x[sim_param["volume_variable_name"]]
    return emissions

def f_Compute_emissions_year(x,sim_param,year):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["Emissions_scope_2_3"][(Vecteur_,year)]
    emissions+= x["emissions_unitaire"]* x[sim_param["volume_variable_name"]]
    return emissions

if type(sim_param["Emissions_scope_2_3"].index) == pd.MultiIndex:
    sim_param["f_Compute_emissions"]= {"Emissions" : f_Compute_emissions_year }#{"Emissions" : partial(f_Compute_emissions,year =year)}
else:
    sim_param["f_Compute_emissions"]={"Emissions" : f_Compute_emissions}
sim_param_acier=sim_param
end = time.process_time()
print("Chargement des données, des modèles et interpolation terminés en : "+str(end-start)+" secondes")
#endregion
Chargement des données, des modèles et interpolation terminés en : 0.25929800000000025 secondes

chargement des données céramique¶

In [3]:
#region chargement des données ceramique
start = time.process_time()
dim_names=["Production_system","year","Vecteurs"];Index_names = ["Production_system"];Energy_system_name="Production_system"
data_set_from_excel =  pd.read_excel(Data_folder+"Hypotheses_ceramics_1D.xlsx", None);
sim_param = extract_sim_param(data_set_from_excel,Index_names = Index_names,dim_names=dim_names,Energy_system_name=Energy_system_name)
sim_param["init_sim_stock"]=create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "unite_prod"
sim_param["retrofit_change_"+sim_param["volume_variable_name"]] = sim_param["retrofit_change_total_proportion_init_"+sim_param["volume_variable_name"]]/len(sim_param["years"]) *\
                                                                  sim_param["init_sim_stock"][sim_param["volume_variable_name"]]

Para_2_fill = {param : sim_param["base_index_year"] for param in ["retrofit_improvement","retrofit_change_"+sim_param["volume_variable_name"],
                                                                  "retrofit_Transition","energy_need_per_"+sim_param["volume_variable_name"]]}
sim_param   =   complete_parameters(sim_param,Para_2_fill=Para_2_fill)

def f_Compute_conso(x,sim_param,Vecteur):
    conso_unitaire = x["conso_unitaire_"+Vecteur]
    return x["energy_need_per_"+sim_param["volume_variable_name"]] * x[sim_param["volume_variable_name"]]*conso_unitaire
def f_Compute_conso_totale(x,sim_param):
    res=0.
    for Vecteur in sim_param["Vecteurs"]:
        res+=x["conso_"+Vecteur]
    return res

for Vecteur in sim_param["Vecteurs"]:
    sim_param["f_Compute_conso_"+Vecteur]={"conso_"+Vecteur : partial(f_Compute_conso,Vecteur =Vecteur)}
sim_param["f_Compute_conso_totale"]={"Conso" : lambda x,sim_param: f_Compute_conso_totale(x,sim_param)}


def f_Compute_emissions(x,sim_param):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["direct_emissions"][Vecteur_]
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["indirect_emissions"][Vecteur_]
    emissions+= x["process_emissions_"+sim_param["volume_variable_name"]]* x[sim_param["volume_variable_name"]]
    return emissions

def f_Compute_emissions_year(x,sim_param,year):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["direct_emissions"][(Vecteur_,year)]
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["indirect_emissions"][(Vecteur_,year)]
    emissions+= x["process_emissions_"+sim_param["volume_variable_name"]]* x[sim_param["volume_variable_name"]]
    return emissions

if type(sim_param["indirect_emissions"].index) == pd.MultiIndex:
    sim_param["f_Compute_emissions"]= {"Emissions" : f_Compute_emissions_year }#{"Emissions" : partial(f_Compute_emissions,year =year)}
else:
    sim_param["f_Compute_emissions"]={"Emissions" : f_Compute_emissions}
sim_param_ceramique=sim_param
end = time.process_time()
print("Chargement des données, des modèles et interpolation terminés en : "+str(end-start)+" secondes")
#endregion
Chargement des données, des modèles et interpolation terminés en : 0.2233360000000002 secondes

chargement des données H2¶

In [4]:
#region chargement des données hydrogene
start = time.process_time()
target_year = 2050 # 2030 ou 2050 --> two excel sheets
dim_names=["Production_system","year","Vecteurs"];Index_names = ["Production_system"];Energy_system_name="Production_system"
data_set_from_excel =  pd.read_excel(Data_folder+"Hypotheses_hydrogen_1D_"+str(target_year)+".xlsx", None);
sim_param = extract_sim_param(data_set_from_excel,Index_names = Index_names,dim_names=dim_names,Energy_system_name=Energy_system_name)
sim_param["init_sim_stock"]=create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "unite_prod"
sim_param["retrofit_change_"+sim_param["volume_variable_name"]] = sim_param["retrofit_change_total_proportion_init_unite_prod"]/len(sim_param["years"]) *\
                                                                  sim_param["init_sim_stock"][sim_param["volume_variable_name"]]

Para_2_fill = {param : sim_param["base_index_year"] for param in ["new_energy","new_yearly_unite_prod","retrofit_improvement","retrofit_change_unite_prod","retrofit_Transition","energy_need_per_unite_prod"]}
sim_param   =   complete_parameters(sim_param,Para_2_fill=Para_2_fill)

def f_Compute_conso(x,sim_param,Vecteur):
    conso_unitaire = x["conso_unitaire_"+Vecteur]
    return x["energy_need_per_"+sim_param["volume_variable_name"]] * x[sim_param["volume_variable_name"]]*conso_unitaire
def f_Compute_conso_totale(x,sim_param):
    res=0.
    for Vecteur in sim_param["Vecteurs"]:
        res+=x["conso_"+Vecteur]
    return res

for Vecteur in sim_param["Vecteurs"]:
    sim_param["f_Compute_conso_"+Vecteur]={"conso_"+Vecteur : partial(f_Compute_conso,Vecteur =Vecteur)}
sim_param["f_Compute_conso_totale"]={"Conso" : lambda x,sim_param: f_Compute_conso_totale(x,sim_param)}


def f_Compute_emissions(x,sim_param):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["Emissions_scope_2_3"][Vecteur_]
    emissions+= x["emissions_unitaire"]* x[sim_param["volume_variable_name"]]
    return emissions

def f_Compute_emissions_year(x,sim_param,year):
    emissions = 0
    for Vecteur_ in sim_param["Vecteurs"]: emissions += x["conso_unitaire_"+Vecteur_]* x[sim_param["volume_variable_name"]]*sim_param["Emissions_scope_2_3"][(Vecteur_,year)]
    emissions+= x["emissions_unitaire"]* x[sim_param["volume_variable_name"]]
    return emissions

if type(sim_param["Emissions_scope_2_3"].index) == pd.MultiIndex:
    sim_param["f_Compute_emissions"]= {"Emissions" : f_Compute_emissions_year }#{"Emissions" : partial(f_Compute_emissions,year =year)}
else:
    sim_param["f_Compute_emissions"]={"Emissions" : f_Compute_emissions}
sim_param_H2=sim_param
end = time.process_time()
print("Chargement des données, des modèles et interpolation terminés en : "+str(end-start)+" secondes")
#endregion
Chargement des données, des modèles et interpolation terminés en : 0.10677599999999998 secondes

chargement des données Olefines¶

In [5]:
#region chargement des données olefine
start = time.process_time()
target_year = 2050 # 2030 ou 2050 --> two excel sheets
dim_names=["Production_system","year","Vecteurs"];Index_names = ["Production_system"];Energy_system_name="Production_system"
data_set_from_excel =  pd.read_excel(Data_folder+"Hypotheses_olefines_1D_QR.xlsx", None);
sim_param = extract_sim_param(data_set_from_excel,Index_names = Index_names,dim_names=dim_names,Energy_system_name=Energy_system_name)
sim_param["init_sim_stock"]=create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "unite_prod"
sim_param["retrofit_change_"+sim_param["volume_variable_name"]] = sim_param["retrofit_change_total_proportion_init_unite_prod"]/len(sim_param["years"]) *\
                                                                  sim_param["init_sim_stock"][sim_param["volume_variable_name"]]

Para_2_fill = {param : sim_param["base_index_year"] for param in ["retrofit_improvement","retrofit_change_unite_prod","retrofit_Transition","energy_need_per_unite_prod",
                                                                                                   "new_energy","new_yearly_repartition_per_Energy_source"]}
sim_param   =   complete_parameters(sim_param,Para_2_fill=Para_2_fill)
sim_param = set_model_function_indus(sim_param)
sim_param_olefines=sim_param
end = time.process_time()
print("Chargement des données, des modèles et interpolation terminés en : "+str(end-start)+" secondes")
#endregion
Chargement des données, des modèles et interpolation terminés en : 0.19794299999999998 secondes

Chargement des données ammoniac¶

In [6]:
#region chargement des données ammonia
start = time.process_time()
target_year = 2050 # 2030 ou 2050 --> two excel sheets
dim_names=["Production_system","year","Vecteurs"];Index_names = ["Production_system"];Energy_system_name="Production_system"
data_set_from_excel =  pd.read_excel(Data_folder+"Hypotheses_ammonia_1D_QR.xlsx", None);
sim_param = extract_sim_param(data_set_from_excel,Index_names = Index_names,dim_names=dim_names,Energy_system_name=Energy_system_name)
sim_param["init_sim_stock"]=create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "unite_prod"
sim_param["retrofit_change_"+sim_param["volume_variable_name"]] = sim_param["retrofit_change_total_proportion_init_unite_prod"]/len(sim_param["years"]) *\
                                                                  sim_param["init_sim_stock"][sim_param["volume_variable_name"]]

Para_2_fill = {param : sim_param["base_index_year"] for param in ["retrofit_improvement","retrofit_change_unite_prod","retrofit_Transition","energy_need_per_unite_prod",
                                                                                                   "new_energy","new_yearly_repartition_per_Energy_source"]}
sim_param   =   complete_parameters(sim_param,Para_2_fill=Para_2_fill)
sim_param = set_model_function_indus(sim_param)
sim_param_amonia=sim_param
end = time.process_time()
print("Chargement des données, des modèles et interpolation terminés en : "+str(end-start)+" secondes")
#endregion
Chargement des données, des modèles et interpolation terminés en : 0.08894199999999985 secondes

simulations¶

In [7]:
#region simulation
sim_stock_acier = launch_simulation(sim_param_acier)
sim_stock_acier_df = pd.concat(sim_stock_acier, axis=0).reset_index().\
    rename(columns={"level_0":"year"}).set_index([ "year"  ,  Energy_system_name  , "old_new"])

sim_stock_ceramique = launch_simulation(sim_param_ceramique)
sim_stock_ceramique_df = pd.concat(sim_stock_ceramique, axis=0).reset_index().\
    rename(columns={"level_0":"year"}).set_index([ "year"  ,  Energy_system_name  , "old_new"])

sim_stock_H2 = launch_simulation(sim_param_H2)
sim_stock_stock_H2_df = pd.concat(sim_stock_H2, axis=0).reset_index().\
    rename(columns={"level_0":"year"}).set_index([ "year"  ,  Energy_system_name  , "old_new"])

sim_stock_olefines = launch_simulation(sim_param_olefines)
sim_stock_stock_olefines_df = pd.concat(sim_stock_olefines, axis=0).reset_index().\
    rename(columns={"level_0":"year"}).set_index([ "year"  ,  Energy_system_name  , "old_new"])

sim_stock_amonia = launch_simulation(sim_param_amonia)
sim_stock_stock_amonia_df = pd.concat(sim_stock_amonia, axis=0).reset_index().\
    rename(columns={"level_0":"year"}).set_index([ "year"  ,  Energy_system_name  , "old_new"])


sim_stock_df = pd.concat([sim_stock_acier_df,sim_stock_ceramique_df,sim_stock_stock_H2_df,sim_stock_stock_olefines_df,sim_stock_stock_amonia_df])

#endregion
Computing: [########################################] 30/30

Computing: [########################################] 30/30

Computing: [########################################] 30/30

Computing: [########################################] 30/30

Computing: [########################################] 30/30

etat initial du parc¶

In [8]:
#region etat initial
### categories pour avoir des groupes de couleurs dans les graphiques
col_class_dict={'BF-BOF' : 1, 'Bio-BF': 1, 'Bio-DRI-EAF': 1, 'CH4-DRI-EAF': 1, 'Coal-DRI-EAF': 1,
       'EAF': 1, 'EW-EAF': 1, 'H-DRI-EAF': 1, 'H2-BF': 1,
        'Séchoir microondes + Four biomasse':2,
       'Séchoir microondes + Four electrique':2,
       'Séchoir microondes + Four gaz':2,
       'Séchoir thermique + Four biomasse':2,
       'Séchoir thermique + Four electrique':2,
       'Séchoir thermique + Four gaz':2,
       'Séchoir thermique + RC + Four biomasse':2,
       'Séchoir thermique + RC + Four electrique':2,
       'Séchoir thermique + RC + Four gaz':2,
    'Biomass-Gasification':3,
       'Coal-Gasification':3, 'Electrolysis':3, 'Gas-Pyrolysis':3, 'SMR':3,
       'eSMR':3,
        'Biomass to Olefins':4, 'Biomass to Olefins - Eboiler':4,
       'Biomass-OCM':4, 'CO2-H2 to Olefins':4, 'CO2-H2 to Olefins - Eboiler':4,
       'CO2-H2-OCM':4, 'Coal to Olefins':4, 'Coal to Olefins - Eboiler':4,
       'Gas to Olefins':4, 'Gas to Olefins - Eboiler':4,
       'Naphtha steam cracking':4, 'Naphtha steam cracking - Eboiler':4,
       'Oxidative Coupling of Methane (OCM)':4,
        'Haber-Bosch' : 5, 'Molten Salt': 5, 'SSAS': 5, 'eNH3 (electrolysis)': 5
                }
#unité de production : kt.
# Energie : MWh/tk émissions en tCO2 par kt produit.

import plotly.express as px
Var = "Conso"
y_df = sim_stock_df.loc[(2020,slice(None),slice(None))].groupby([Energy_system_name])[Var].sum().to_frame().reset_index()
#y_df.loc[:,"Categorie"]=pd.MultiIndex.from_tuples([(str(col_class_dict[key]),key) for key in y_df.Categorie])
color_dict = gen_grouped_color_map(col_class_dict)
y_df["class"]=[col_class_dict[cat] for cat in y_df.Production_system]
y_df=y_df.sort_values(by=['class'])
y_df[Var]=y_df[Var]/10**6
fig = px.bar(y_df,x="class", y=Var, color="Production_system", title="Wide-Form Input",color_discrete_map=color_dict)
fig=fig.update_layout(title_text="Conso énergie finale (en TWh)", xaxis_title="Categorie",yaxis_title="Conso [TWh]")
fig.show()
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline

Var = "Emissions"
y_df = sim_stock_df.loc[(2020,slice(None),slice(None))].groupby([Energy_system_name])[Var].sum().to_frame().reset_index()
#y_df.loc[:,"Categorie"]=pd.MultiIndex.from_tuples([(str(col_class_dict[key]),key) for key in y_df.Categorie])
color_dict = gen_grouped_color_map(col_class_dict)
y_df["class"]=[col_class_dict[cat] for cat in y_df.Production_system]
y_df=y_df.sort_values(by=['class'])
y_df[Var]=y_df[Var]/10**6
fig = px.bar(y_df,x="class", y=Var, color="Production_system", title="Wide-Form Input",color_discrete_map=color_dict)
fig=fig.update_layout(title_text="Emissions CO2 [MTCO2]", xaxis_title="Categorie",yaxis_title="Emissions CO2 [MTCO2]")
fig.show()
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
#endregion

résulats de la simulation¶

In [9]:
#region représentation des résultats
Var = "Conso"
y_df = sim_stock_df.groupby(["year",Energy_system_name])[Var].sum().to_frame().reset_index().\
    pivot(index='year', columns=Energy_system_name).loc[[year for year in sim_param["years"][1:]],Var]/10**6
y_df.columns=pd.MultiIndex.from_tuples([(str(col_class_dict[key]),key) for key in y_df.columns])

fig = MyStackedPlotly(y_df=y_df)
fig=fig.update_layout(title_text="Conso énergie finale par mode de chauffage (en TWh)", xaxis_title="Année",yaxis_title="Conso [TWh]")
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
fig.show()

Var = "Emissions"
y_df = sim_stock_df.groupby(["year",Energy_system_name])[Var].sum().to_frame().reset_index().\
    pivot(index='year', columns=Energy_system_name).loc[[year for year in sim_param["years"][1:]],Var]/10**6
y_df.columns=pd.MultiIndex.from_tuples([(str(col_class_dict[key]),key) for key in y_df.columns])

fig = MyStackedPlotly(y_df=y_df)
fig=fig.update_layout(title_text="Emissions CO2 Mt", xaxis_title="Année",yaxis_title="Emissions [MtCO2]")
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
fig.show()

y_df = sim_stock_df.groupby(["year"])[["conso_"+Vec for Vec in sim_param["Vecteurs"]]].sum().loc[[year for year in sim_param["years"][1:]],:]/10**6
fig = MyStackedPlotly(y_df=y_df)
fig=fig.update_layout(title_text="Conso énergie finale par vecteur (en TWh)", xaxis_title="Année",yaxis_title="Conso [TWh]")
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
fig.show()

#endregion
In [ ]: